from zhipuai import ZhipuAI
import cv2
import time
import base64


def image_change():
    with open("D:\\天津比赛\\camera_image.jpg", 'rb') as image_file:
        my_str = base64.b64encode(image_file.read()).decode('utf-8')
    return my_str


class ZhipuAIChatbot:
    def __init__(self, api_key):
        self.client = ZhipuAI(api_key=api_key)
    
    def ask_about_image(self, image_url):
        response = self.client.chat.completions.create(
            model="glm-4v",
            messages=[
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "请你从图像中提炼出人类面部关键的特征和信息，假设你是一个陪护人类情感的机器人，希望你能够理解人类的需求和情感，根据人类的表情进行相关的回答，比如人类伤心，你就安慰他，如果忧郁，你就鼓励他。"
                        },
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": image_url
                            }
                        }
                    ]
                }
            ]
        )
        with open('messages_with_timestamps.txt', 'a', encoding='utf-8') as file:
    
        # 获取当前时间戳
            timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        
        # 构造带有时间戳的消息内容
            message_with_timestamp = f"{timestamp}: {response.choices[0].message.content}\n"
        
        # 写入文件
            file.write(message_with_timestamp)
        # 假设响应总是有效的，并且我们只对第一个选择感兴趣
        if response.choices:
            return response.choices[0].message.content
        else:
            return "没有获得有效的响应。"

cap = cv2.VideoCapture(0)

# 初始化开始时间
start_time = time.time()
# 设置保存图片的时间间隔（秒）
save_interval = 5

# 图片计数器，用于生成不同的文件名（可选）
image_counter = 0

while True:
    # 读取摄像头的帧
    ret, frame = cap.read()
    
    # 如果成功读取帧，ret为True
    if ret:
        # 显示图像
        cv2.imshow('Live Video', frame)
        
        # 检查是否到了保存图像的时间
        if (time.time() - start_time) >= save_interval:
            # 生成带有时间戳的文件名，防止文件被覆盖
            # timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            filename = f"camera_image.jpg"
            # 也可以使用图片计数器生成文件名（可选）
            # filename = f"camera_image_{image_counter}.jpg"
            # image_counter += 1
            
            # 保存图像到本地
            cv2.imwrite(filename, frame)
            
            # 打印保存信息
            print(f"Image saved as {filename}")
            base64_str = image_change()
            api_key = "69abb0f1108266a676a117ce132968e8.142O8E9qeuCYldsa"  # 请替换成你自己的API Key
            chatbot = ZhipuAIChatbot(api_key)
            image_url = base64_str
            print(chatbot.ask_about_image(image_url))
            # 重置开始时间，以便下一个间隔计时
            start_time = time.time()
        
        # 等待按键，如果按下'q'键则退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break






# 使用示例

# 释放摄像头资源
cap.release()
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()